package com.haois.mp.database.util.mp;

import com.haois.mp.database.commom.constant.StatusCode;
import com.haois.mp.database.module.common.daomain.Subject;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import java.util.Date;

/**
 * Created by haol on 2017/4/20.
 */
public class ProduceJwt {

    /*
    iss(Issuser)：代表这个JWT的签发主体；
    sub(Subject)：代表这个JWT的主体，即它的所有人；
    aud(Audience)：代表这个JWT的接收对象；
    exp(Expiration time)：是一个时间戳，代表这个JWT的过期时间；
    nbf(Not Before)：是一个时间戳，代表这个JWT生效的开始时间，意味着在这个时间之前验证JWT是会失败的；
    iat(Issued at)：是一个时间戳，代表这个JWT的签发时间；
    jti(JWT ID)：是JWT的唯一标识。
    */
    private HandleToken handleToken = new HandleToken();

    private JwtBuilder createJwtBuilder(String jwtId) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey key = handleToken.generalKey();
        JwtBuilder jwtBuilder = Jwts.builder();
        jwtBuilder.setHeaderParam("tye", "jwt");
        jwtBuilder.setHeaderParam("alg", "HS256");
        jwtBuilder.setId(jwtId);
        jwtBuilder.setIssuer("MobileGroup");
        jwtBuilder.signWith(signatureAlgorithm, key);//加密
        return jwtBuilder;
    }

    private JwtBuilder produceToken(long JwtTtlMillis) {
        JwtBuilder jwtBuilder = this.createJwtBuilder(StatusCode.JWT_ID);
        jwtBuilder.setIssuedAt(new Date());
        if (JwtTtlMillis > 0) {
            long expMillis = System.currentTimeMillis() + JwtTtlMillis;
            Date exp = new Date(expMillis);
            jwtBuilder.setExpiration(exp);
        }
        return jwtBuilder;
    }

    public String produceWeChatToken(Subject subject) {
        String subStr = handleToken.generalSubject(subject);
        JwtBuilder jwtBuilder = this.produceToken(StatusCode.JWT_CHAT_TTL);
        jwtBuilder.setSubject(subStr);//接受主体，此处为登录的用户
        jwtBuilder.setAudience("TEST");
        return jwtBuilder.compact();
    }
    public String getShareToken(){
        return this.produceWeChatToken(new Subject(StatusCode.SHARE_NUM));
    }
}
